home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_13_05 / gilhooly / mainwnd.c < prev    next >
C/C++ Source or Header  |  1995-03-12  |  6KB  |  182 lines

  1. #undef GLOBALS
  2. #include "winjes.h"
  3. /*  
  4.     Routine:    MainWndProc
  5.     Called By:  Windows
  6.     Usage:      This is the window procedure for the main window
  7. */
  8.  
  9. long FAR PASCAL MainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  10. {
  11.              
  12.             BOOL            rc;
  13.             char            szName[MAXNAME+1];
  14.             FARPROC         lpProc;
  15.             HDC             hDC;
  16.             HMENU           hMenu;
  17.             int             n;
  18.             int             len;
  19.             int             s;
  20.             PAINTSTRUCT     ps;
  21.             POINT           ptClick;
  22.             RECT            rect;
  23.     struct  hostent FAR     *hp;
  24.     struct  sockaddr_in     sin;
  25.             WORD            wVer;
  26.             WSADATA         wsData;
  27.     switch (message) 
  28.     {                      
  29.       case WM_CREATE:
  30.         wVer = 0x101;   /* version 1.1 */
  31.         rc = WSAStartup(wVer, (LPWSADATA)&wsData);
  32.         sock = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  33.         gethostname(szName, MAXNAME);
  34.         hp = gethostbyname((LPSTR)szName);
  35.         if (hp == NULL)
  36.           lstrcpy(szMsg, (LPSTR)"error");
  37.         else
  38.         {
  39.           sin.sin_family = AF_INET;
  40.           sin.sin_port   = htons(MYPORT);
  41.           _fmemcpy((struct sockaddr_in FAR *)&sin.sin_addr, (struct hostent FAR *)hp->h_addr, hp->h_length);
  42.           n = bind(sock, (struct sockaddr FAR *)&sin, sizeof(sin));
  43.           if (n < 0)
  44.             wsprintf((LPSTR)szMsg, (LPSTR)"bind: %d", n);
  45.           else
  46.           {
  47.             WSAAsyncSelect(sock, hWnd, WM_SOCKET, FD_READ | FD_CONNECT | FD_CLOSE);    
  48.             lstrcpy(szMsg, (LPSTR)"ready");
  49.           }
  50.         }
  51.         InvalidateRect(hWnd, NULL, TRUE);
  52. /*
  53. add Tell... to the system menu (so we can get to it even when minimized)
  54. */        
  55.         hMenu = GetSystemMenu(hWnd, FALSE);
  56.         InsertMenu(hMenu, 0, MF_BYPOSITION, IDM_SEND, (LPSTR)"&Sub...");
  57.         InsertMenu(hMenu, 1, MF_BYPOSITION | MF_SEPARATOR, (UINT)-1, (LPSTR)"");
  58.         break;              
  59.         
  60.       case WM_SOCKET:
  61.         switch (LOWORD(lParam))
  62.         {
  63.           case FD_READ:       // new data/receive queue full                               
  64.             len = sizeof(sin);
  65.             n = recvfrom(sock, (LPSTR)(Message far *)&InMessage, sizeof(Message), 0, (struct sockaddr FAR *)&sin, (int FAR *)&len);
  66.             if (n < 0)
  67.               wsprintf(szMsg, (LPSTR)"err: %d", n);
  68.             else
  69.             {
  70.               if (!lstrcmpi((LPSTR)InMessage.szCommand, (LPSTR)"reboot"))
  71.                 ExitWindows(EW_REBOOTSYSTEM, 0);
  72.               if (n = WinExec((LPCSTR)InMessage.szCommand, SW_NORMAL) < 32)
  73.                 wsprintf(szMsg, (LPSTR)"rc = %d", n);
  74.               else
  75.                 lstrcpy(szMsg, (LPSTR)"command");
  76.             }
  77.             break;
  78.  
  79.           case FD_CLOSE:       // connection closed
  80.             lstrcpy(szMsg, (LPSTR)"closed");
  81.             break;
  82.  
  83.           case FD_CONNECT:       // connection request
  84.             lstrcpy(szMsg, (LPSTR)"connect");
  85.             break;            
  86.         }
  87.         InvalidateRect(hWnd, NULL, TRUE);
  88.         break;
  89.         
  90.       case WM_KEYDOWN:
  91.         if (wParam == VK_HOME)
  92.           PostMessage(hWnd, WM_RBUTTONDOWN, (WPARAM)0, MAKELPARAM(0, 0));
  93.         break;
  94.         
  95.       case WM_RBUTTONDOWN:
  96.         hMenu = CreatePopupMenu();
  97.         AppendMenu(hMenu, MF_STRING,    IDM_SEND,  (LPSTR)"&Sub...");
  98.         AppendMenu(hMenu, MF_SEPARATOR, (UINT)-1,  (LPSTR)"");
  99.         AppendMenu(hMenu, MF_STRING,    IDM_ABOUT, (LPSTR)"&About");
  100.         ptClick = MAKEPOINT(lParam);
  101.         ClientToScreen(hWnd, &ptClick);                                
  102.         TrackPopupMenu(hMenu, TPM_LEFTALIGN, ptClick.x, ptClick.y, 0, hWnd, NULL);
  103.         InvalidateRect(hWnd, NULL, TRUE);                      
  104.         DestroyMenu(hMenu);
  105.         break;
  106.         
  107.       case WM_COMMAND:
  108.         switch(wParam)
  109.         {
  110.           case IDM_SEND:                            
  111.             lpProc = MakeProcInstance(HostProc, hInst);
  112.             rc = DialogBox(hInst, (LPSTR)"Command", hWnd, lpProc);
  113.             FreeProcInstance(lpProc);
  114.             if (!rc)
  115.               break;            
  116.             s = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
  117.             hp = gethostbyname((LPSTR)OutMessage.szHostName);    
  118.             if (hp == NULL)
  119.             {
  120.                lstrcpy(szMsg, (LPSTR)"Invalid Host");
  121.                closesocket(s);
  122.             }
  123.             else
  124.             {
  125.               sin.sin_family = AF_INET;
  126.               sin.sin_port   =  htons(MYPORT); 
  127.               _fmemcpy((struct sockaddr_in FAR *)&sin.sin_addr, (struct hostent FAR *)hp->h_addr, hp->h_length);
  128.               gethostname((LPSTR)OutMessage.szHostName, MAXHOST-1);
  129.               sendto(s, (LPSTR)(Message far *)&OutMessage, sizeof(Message), 0, (struct sockaddr FAR *)&sin, sizeof(sin));
  130.               closesocket(s);
  131.               lstrcpy((LPSTR)szMsg, (LPSTR)"outgoing");
  132.             }
  133.             InvalidateRect(hWnd, NULL, TRUE);
  134.             break;
  135.  
  136.           case IDM_ABOUT:
  137.             lpProc = MakeProcInstance(AboutProc, hInst);
  138.             rc = DialogBox(hInst, (LPSTR)"About", hWnd, lpProc);
  139.             FreeProcInstance(lpProc);
  140.             break;
  141.         }
  142.         break;
  143.         
  144.       case WM_SYSCOMMAND:
  145.         switch(wParam)
  146.         {
  147.           case IDM_SEND:                            
  148.             PostMessage(hWnd, WM_COMMAND, IDM_SEND, 0L);
  149.             break;
  150.             
  151.           default:                          
  152.             return (DefWindowProc(hWnd, message, wParam, lParam));
  153.             break;
  154.       }
  155.       break;
  156.       
  157.       case WM_PAINT:
  158.         hDC = BeginPaint(hWnd, &ps);
  159.         GetClientRect(hWnd, &rect);
  160.         DrawText(hDC, (LPSTR)szMsg, -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
  161.         EndPaint(hWnd, &ps);
  162.         break;
  163.         
  164.       case WM_CLOSE:
  165.         DestroyWindow(hWnd);
  166.         break;
  167.         
  168.       case WM_DESTROY:                  
  169.         closesocket(sock);
  170.         WSACleanup();
  171.         PostQuitMessage(0);
  172.         break;
  173.  
  174.       default:                          
  175.         return (DefWindowProc(hWnd, message, wParam, lParam));
  176.         break;
  177.     }
  178.  
  179.     return FALSE;
  180. }
  181.  
  182.